/* 
 * Copyright (C) 2014 Ningbo Yuanqun Inc., All Rights Reserved. 
 */
package com.yuanqunsoft.alimigration.engine;

import java.io.FileNotFoundException;

import com.yuanqunsoft.alimigration.common.Helper;
import com.yuanqunsoft.alimigration.common.JSONUtil;
import com.yuanqunsoft.alimigration.engine.vo.RuleImpl;

/**
 * <p>
 * 对指定文件应用指定规则集扫描的类
 * </p>
 * <p>
 * 通过指定一个的规则集来初始化一个 <b>ParseManager</b> 的实例，通过这个实例的{@link #scanWithRule(String)}方法，
 * 可以对一个指定的文件进行扫描。对文件的扫描策略基于初始化时所提供的规则集，可以通过{@link #setRuleImpls(String)} 方法指定新的规则集。
 * </p>
 * 
 * @author ShaoYu
 * @version 1.0
 */
public final class ParseManager {

    private ParseEngine parseEngine;

    /**
     * <p>
     * 通过给定的 <code>ruleImpls</code> 创建一个 <code>ParseManager</code> 的实例
     * </p>
     * 
     * @param ruleImpls
     *            扫描所使用的规则集，一个JSON格式的字符串，如
     * 
     * <pre>
     *  {
     *      "rulName": <b><i>rule name</i></b> (A String),
     *      "parseEngineType": <b><i>parser engine type</i></b>, (An Integer)
     *      "className": <b><i>implement class name</i></b> (A String)
     *  }
     * </pre>
     * @see #setRuleImpls(String)
     */
    public ParseManager(String ruleImpls) {
        setRuleImpls(ruleImpls);
    }

    /**
     * <p>
     * 对文件进行扫描，并返回包含结果的JSON字符串。
     * </p>
     * 
     * @param scanFilePath
     *            待扫描文件的相对路径，路径相对于配置文件中所设定的根目录
     * @return 返回扫描的结果集，JSON格式，如
     * 
     *         <pre>
     * [ {
     *     "rulName" : "Aliyun_OSS_BucketName",
     *     "alerts" : [ {
     *             "aleResource" : "testFiles\\test\\scan\\classfile\\BucketNameByteCode\\BucketNameByteCodeTestCase1.class",
     *             "aleLine" : 21
     *      }]
     *    }, {
     *     "ruleName" : "AWS_Beanstalk_ReuseS3Client",
     *     "alerts" : [ {
     *             "aleResource" : "testFiles\\test\\scan\\javafile\\ReuseS3ClientAntlr\\ReuseS3ClientAntlrTestCase2.java",
     *             "aleLine" : 16
     *      }]
     * } ]
     * </pre>
     * @throws FileNotFoundException
     */
    public String scanWithRule(String scanFilePath) throws FileNotFoundException {
        Helper.checkNull(scanFilePath, "scanFilePath");
        return JSONUtil.objToStr(parseEngine.scan(scanFilePath));
    }

    /**
     * <p>
     * 更换规则集
     * </p>
     * <p>
     * <code>ruleImpls</code>的格式应该为：
     * 
     * <pre>
     *  {
     *      "rulName": <b><i>rule name</i></b> (A String),
     *      "parseEngineType": <b><i>parser engine type</i></b>, (An Integer)
     *      "className": <b><i>implement class name</i></b> (A String)
     *  }
     * </pre>
     * 
     * </p>
     * 
     * @param ruleImpls
     *            扫描所使用的规则集，一个JSON格式的字符串
     */
    public void setRuleImpls(String ruleImpls) {
        Helper.checkStringNullorEmpty(ruleImpls, "ruleImpls");
        parseEngine = new ParseEngine(JSONUtil.strToSet(ruleImpls, RuleImpl.class));
    }

}
